package utils

import (
	"fmt"
	"github.com/casbin/casbin/v2"
	"github.com/kataras/iris/v12"
	"gorm.io/driver/mysql"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"wit-admin-go/conf"
	log "wit-admin-go/system/zaplogger"
)

// DB 数据库操作
var DB *gorm.DB

// WitEnforcer 角色权限管理工具
var WitEnforcer *casbin.Enforcer

// Wit iris操作 *iris.Application
var Wit = iris.New()

func GetDB() *gorm.DB {
	switch conf.CONFIG.WitAdmin.Db {
	case 1:
		DB = postgresDB()
		break
	case 2:
		DB = mysqlDB()
		break
	default:
		panic("===> 未知的数据库,或配置文件配置错误")
	}
	return DB
}

// postgres数据库配置
func postgresDB() *gorm.DB {
	dns := fmt.Sprintf("host=%s port=%d user=%s dbname=%s password=%s", conf.CONFIG.PostGre.Host, conf.CONFIG.PostGre.Port, conf.CONFIG.PostGre.Username, conf.CONFIG.PostGre.Database, conf.CONFIG.PostGre.Password)
	gormDB, err := gorm.Open(postgres.New(postgres.Config{
		DSN: dns,
	}), &gorm.Config{
		// 表前缀
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   conf.CONFIG.WitAdmin.TablePrefix,
			SingularTable: true,
		},
		DisableForeignKeyConstraintWhenMigrating: true, // 自动外键
	})
	sqlDB, err := gormDB.DB()
	if err != nil {
		fmt.Printf("数据库连接错误：%v\n", err.Error())
		log.Log.Panic("无法连接postgres数据库")
	}
	if sqlDB.Ping() == nil {
		log.Log.Info("连接postgres数据库成功")
	}
	// 访问控制库
	cErr := WitCasbin(gormDB)
	if cErr == nil {
		log.Log.Info("Casbin加载成功")
	}
	// 默认1,2 error,3 warn, 4 info
	gormDB.Logger.LogMode(2)
	return gormDB
}

// mysql数据库配置
func mysqlDB() *gorm.DB {
	dns := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=%v", conf.CONFIG.Mysql.Username, conf.CONFIG.Mysql.Password, conf.CONFIG.Mysql.Host, conf.CONFIG.Mysql.Port, conf.CONFIG.Mysql.Database, conf.CONFIG.Mysql.Charset, conf.CONFIG.Mysql.ParseTime)
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN: dns,
	}), &gorm.Config{
		// 表前缀
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   conf.CONFIG.WitAdmin.TablePrefix,
			SingularTable: true,
		},
		DisableForeignKeyConstraintWhenMigrating: true, // 自动外键
	})

	sqlDB, err := db.DB()
	if err != nil {
		log.Log.Error("数据库连接错误：", err.Error())
		log.Log.Panic("无法连接mysql数据库")
	}
	if sqlDB.Ping() == nil {
		log.Log.Info("连接mysql数据库成功")
	}
	// 访问控制库
	cErr := WitCasbin(db)
	if cErr == nil {
		log.Log.Info("Casbin加载成功")
	}

	//设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(conf.CONFIG.Mysql.MaxIdleCons)
	//设置打开数据库连接的最大数量
	sqlDB.SetMaxOpenConns(conf.CONFIG.Mysql.MaxOpenCons)
	db.Logger.LogMode(2)
	return db
}
